package cn.tiger.service;

import cn.tiger.config.AiServiceConfig;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;

import java.time.Duration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * AI服务类
 * 
 * 负责与阿里云通义千问Qwen-Plus模型的集成与交互
 * 提供智能对话功能，包括消息构建、API调用、响应解析等功能
 * 支持对话历史管理和多轮对话能力
 * 
 * @author AI Backend Team
 * @version 1.0
 * @since 2025-09-26
 */
@Slf4j // 启用Lombok日志功能
@Service // Spring服务层注解
@RequiredArgsConstructor // Lombok注解，生成构造函数
public class AiService {
    
    /** AI服务配置类，包含API地址、密钥、模型参数等配置信息 */
    private final AiServiceConfig aiServiceConfig;
    /** JSON对象映射器，用于解析AI API返回的JSON响应 */
    private final ObjectMapper objectMapper;
    /** Web客户端，用于发起HTTP请求调用AI API */
    private final WebClient webClient;
    
    /**
     * 调用AI API获取智能回答
     * 
     * 发起HTTP请求调用阿里云通义千问模型，获取AI对用户问题的智能回答
     * 包括请求构建、API调用、响应解析和异常处理
     * 支持超时控制和错误降级处理
     * 
     * @param messages 对话消息列表，包含用户问题和历史对话
     * @return AI生成的回答内容，异常情况下返回默认错误信息
     */
    public String getAiResponse(List<Map<String, String>> messages) {
        try {
            // 构建符合阿里云API规范的请求体
            Map<String, Object> requestBody = new HashMap<>();
            requestBody.put("model", aiServiceConfig.getModel()); // 指定使用的AI模型
            requestBody.put("messages", messages); // 对话消息列表
            requestBody.put("max_tokens", aiServiceConfig.getMaxTokens()); // 最大返回令牌数
            requestBody.put("temperature", aiServiceConfig.getTemperature()); // 創造性参数
            
            // 使用WebClient发起POST请求调用AI API
            String response = webClient.post()
                    .uri(aiServiceConfig.getBaseUrl() + "/chat/completions") // API端点
                    .header(HttpHeaders.AUTHORIZATION, "Bearer " + aiServiceConfig.getApiKey()) // 身份验证
                    .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) // 请求类型
                    .bodyValue(requestBody) // 请求体
                    .retrieve()
                    .bodyToMono(String.class)
                    .timeout(Duration.ofSeconds(aiServiceConfig.getTimeout())) // 超时控制
                    .block(); // 同步等待响应
            
            // 解析JSON响应并提取AI生成的内容
            JsonNode jsonNode = objectMapper.readTree(response);
            return jsonNode.get("choices").get(0).get("message").get("content").asText();
            
        } catch (Exception e) {
            // 记录详细错误信息并返回用户友好的错误提示
            log.error("调用AI API失败", e);
            return "抱歉，我现在无法回答您的问题，请稍后再试。";
        }
    }
    
    /**
     * 构建对话消息列表
     * 
     * 根据对话ID和新问题构建符合AI模型要求的消息格式
     * 包括系统提示设置、对话历史加载和当前问题添加
     * 为AI模型提供完整的上下文信息
     * 
     * @param conversationId 对话ID，用于获取历史消息(可为空)
     * @param newQuestion 新的用户问题
     * @return 格式化的消息列表，包含角色和内容
     */
    public List<Map<String, String>> buildMessages(Long conversationId, String newQuestion) {
        List<Map<String, String>> messages = new ArrayList<>();
        
        // 添加系统提示
        Map<String, String> systemMessage = new HashMap<>();
        systemMessage.put("role", "system");
        systemMessage.put("content", "你是一个智能助手，请用中文回答用户的问题。回答要准确、有用、友好。");
        messages.add(systemMessage);
        
        // 如果有对话历史，添加历史消息
        if (conversationId != null) {
            // 这里可以添加获取历史消息的逻辑
            // 为了简化，暂时只添加当前问题
        }
        
        // 添加用户问题
        Map<String, String> userMessage = new HashMap<>();
        userMessage.put("role", "user");
        userMessage.put("content", newQuestion);
        messages.add(userMessage);
        
        return messages;
    }
}
